<?php

class TheatersController extends AppController {

    var $name = 'Theaters';
    var $uses = array('Theater', 'Costume', 'Activity', 'CashMovement', 'Cash');

    function index($date_from = null, $date_to = null) {

        if ($date_from != null) {
            $this->data['Theater']['date_from'] = date('d/m/Y', strtotime($date_from));
            $this->data['Theater']['date_to'] = date('d/m/Y', strtotime($date_to));
        }

        $this->Theater->recursive = 0;

        //si vienen filtros aplicados
        if (!empty($this->data)) {

            $datos = $this->data['Theater'];
            $filtro = ' 1=1 ';

            if (isset($datos['name']) && trim($datos['name']) != '') {
                $filtro .= ' AND Theater.name like "%' . $datos['name'] . '%"';
            }
            if (isset($datos['address']) && trim($datos['address']) != '') {
                $filtro .= ' AND Theater.address like "%' . $datos['address'] . '%"';
            }
            if (isset($datos['date_from']) && trim($datos['date_from']) != '') {
                list($d, $m, $a) = explode("/", $datos['date_from']);
                $datos['date_from'] = $a . "-" . $m . "-" . $d . ' 00:00:00';

                $filtro .= ' AND Theater.start_date >= "' . $datos['date_from'] . '"';
            }
            if (isset($datos['date_to']) && trim($datos['date_to']) != '') {
                list($d, $m, $a) = explode("/", $datos['date_to']);
                $datos['date_to'] = $a . "-" . $m . "-" . $d . ' 23:59:59';

                $filtro .= ' AND Theater.finish_date <= "' . $datos['date_to'] . '"';
            }

            $this->paginate['order'] = array('Theater.start_date' => 'ASC', 'Theater.finish_date' => 'ASC', 'Theater.name' => 'ASC');
            $resultados = $this->paginate('Theater', array($filtro));

            $this->set('theaters', $resultados);

            //guardo el filtro usado en session para despues recordarlo con el paginate
            $restricciones = array('filter' => $filtro, 'order' => $this->paginate['order']);
            $this->Session->write('search_conditions_theaters', $restricciones);
        } elseif ($this->Session->check('search_conditions_theaters')) {

            //si habia algun filtro guardado en session lo tengo que tomar y seguir aplicando el mismo
            //si estoy paginando
            if (isset($this->params['named']['limit']) || isset($this->params['named']['page'])) {
                $restricciones = $this->Session->read('search_conditions_theaters');

                //si esta acomodando por algun campo en particular
                if (isset($this->params['named']['sort'])) {
                    $this->paginate['order'] = array($this->params['named']['sort'] => $this->params['named']['sort']['direction']);
                } else {
                    //sino sigo aplicando el mismo que ya venia
                    $this->paginate['order'] = $restricciones['order'];
                }
                //si hay que seguir el filtro de empleados
                $resultados = $this->paginate('Theater', array($restricciones['filter']));

                $this->set('theaters', $resultados);
            } else {
                //lo borro de la session
                $filtro = ' 1=1 ';
                $this->Session->delete('search_conditions_theaters');
                $this->paginate['order'] = array('Theater.start_date' => 'ASC', 'Theater.finish_date' => 'ASC', 'Theater.name' => 'ASC');
                $resultados = $this->paginate('Theater', array($filtro));
                $this->set('theaters', $resultados);
            }
        } else {

            //le pongo un filtro por default
            $filtro = ' 1=1 ';
            $this->paginate['order'] = array('Theater.start_date' => 'ASC', 'Theater.finish_date' => 'ASC', 'Theater.name' => 'ASC');
            $resultados = $this->paginate('Theater', array($filtro));
            $this->set('theaters', $resultados);
        }
    }

    function view($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Obra de Teatro inexistente', true));
            $this->redirect(array('action' => 'index'));
        }
        $datos = $this->Theater->read(null, $id);
        $empleados = $datos['Employee'];
        unset($datos['Employee']);

        //ahora dejo indexado en Employee por el id
        $array_emp_aux = array();
        foreach ($empleados as $emp) {
            $array_emp_aux[$emp['id']] = $emp;
        }
        $datos['Employee'] = $array_emp_aux;
        $this->set('theater', $datos);

        //traigo el historial de este theater
        $activities = $this->Activity->find('all', array(
            'recursive' => 0,
            'conditions' => array(
                'Activity.register' => 'Theater.' . $id
            ),
            'order' => array('Activity.created' => 'ASC')
                ));
        $this->set(compact('activities'));
    }

    function add($var_start_date = null) {

        if (!empty($this->data)) {

            //me pongo a armar los campos de las fechas
            $array_datos = $this->data;

            list($d, $m, $a) = explode("/", $array_datos['Theater']['date_from']);
            $fecha_inicio = $a . "-" . $m . "-" . $d . ' ' . $array_datos['Theater']['start_hour'] . ':' . $array_datos['Theater']['start_minute'] . ':00';
            $array_datos['Theater']['start_date'] = $fecha_inicio;

            $fecha_fin = $a . "-" . $m . "-" . $d . ' ' . $array_datos['Theater']['finish_hour'] . ':' . $array_datos['Theater']['finish_minute'] . ':00';
            $array_datos['Theater']['finish_date'] = $fecha_fin;

            //saco del array aquellos empleados que no van seteados
            $total_cost_employee = 0;
            foreach ($array_datos['TheatersEmployee'] as $id => $emple) {
//                if (!$emple['employee_id']) {
                if (!$emple['cost']) {
                    unset($array_datos['TheatersEmployee'][$id]);
                } else {
                    $total_cost_employee += $array_datos['TheatersEmployee'][$id]['cost'];
                }
            }
            if (empty($array_datos['TheatersEmployee'])) {
                unset($array_datos['TheatersEmployee']);
            }

            $total_cost_expense = 0;
            //saco del array aquellos gastos que no van seteados
            foreach ($array_datos['TheatersExpense'] as $id => $emple) {
                if (!$emple['cost']) {
                    unset($array_datos['TheatersExpense'][$id]);
                } else {
                    $total_cost_expense += $array_datos['TheatersExpense'][$id]['cost'];
                }
            }
            if (empty($array_datos['TheatersExpense'])) {
                unset($array_datos['TheatersExpense']);
            }

            //seteo los totales
            $array_datos['Theater']['employee_cost'] = $total_cost_employee;
            $array_datos['Theater']['expense_cost'] = $total_cost_expense;

            //saco las validaciones para que no salten
            unset($this->Theater->TheatersCostume->validate['theater_id']);
            unset($this->Theater->TheatersEmployee->validate['theater_id']);
            unset($this->Theater->TheatersExpense->validate['theater_id']);

            $this->Theater->create();
            if ($this->Theater->saveAll($array_datos, array('validate' => 'first'))) {
                $this->Session->setFlash(__('La Obra de Teatro ha sido creada', true));
                $this->redirect(array('controller' => 'futures', 'action' => 'por_dia', strtotime($array_datos['Theater']['start_date'])));
            } else {
                $this->Session->setFlash(__('La Obra de Teatro no ha sido creada. Por favor, intente nuevamente.', true));
            }
        }

        //si viene la variable $var_start_date, entonces se lo pongo en el this->data
        if ($var_start_date != NULL) {
            $this->data['Theater']['date_from'] = date('d/m/Y', $var_start_date);
            $this->data['Theater']['start_hour'] = date('H', $var_start_date);
            $this->data['Theater']['finish_hour'] = date('H', $var_start_date);
            $this->data['Theater']['start_minute'] = date('i', $var_start_date);
            $this->data['Theater']['finish_minute'] = date('i', $var_start_date);
        }

        //armo el array con las horas
        $hours = array();
        for ($i = 8; $i <= 23; $i++) {
            if ($i < 10) {
                $value = '0' . $i;
            } else {
                $value = '' . $i;
            }
            $hours[$i] = $value;
        }
        $this->set(compact('hours'));

        //armo el array con los minutos
        $minutes = array(0 => '00', 30 => '30');
        $this->set(compact('minutes'));

        //traigo un array con todos los trajes
        $costumes = $this->Costume->find('list', array('conditions' => array('Costume.deleted' => 0)));
        $this->set(compact('costumes'));

        $empleados = $this->Theater->Employee->find('all', array('fields' => array('Employee.first_name', 'Employee.last_name', 'Employee.id'), 'conditions' => array('Employee.deleted' => 0)));
        $employees = array();
        foreach ($empleados as $emp) {
            $employees[$emp['Employee']['id']] = $emp['Employee']['first_name'] . ' ' . $emp['Employee']['last_name'];
        }
        $this->set(compact('employees'));
    }

    function edit($id = null) {
        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Obra de Teatro inexistente', true));
            $this->redirect(array('action' => 'index'));
        }
        if (!empty($this->data)) {

            //me pongo a armar los campos de las fechas
            $array_datos = $this->data;

            list($d, $m, $a) = explode("/", $array_datos['Theater']['date_from']);
            $fecha_inicio = $a . "-" . $m . "-" . $d . ' ' . $array_datos['Theater']['start_hour'] . ':' . $array_datos['Theater']['start_minute'] . ':00';
            $array_datos['Theater']['start_date'] = $fecha_inicio;

            $fecha_fin = $a . "-" . $m . "-" . $d . ' ' . $array_datos['Theater']['finish_hour'] . ':' . $array_datos['Theater']['finish_minute'] . ':00';
            $array_datos['Theater']['finish_date'] = $fecha_fin;

            //saco del array aquellos empleados que no van seteados
            $total_cost_employee = 0;
            foreach ($array_datos['TheatersEmployee'] as $id => $emple) {
//                if (!$emple['employee_id']) {
                if (!$emple['cost']) {
                    unset($array_datos['TheatersEmployee'][$id]);
                } else {
                    $total_cost_employee += $emple['cost'];
                }
            }
            if (empty($array_datos['TheatersEmployee'])) {
                unset($array_datos['TheatersEmployee']);
            }

            $total_cost_expense = 0;
            //saco del array aquellos gastos que no van seteados
            foreach ($array_datos['TheatersExpense'] as $id => $expe) {
                if (!$expe['cost']) {
                    unset($array_datos['TheatersExpense'][$id]);
                } else {
                    $total_cost_expense += $expe['cost'];
                }
            }
            if (empty($array_datos['TheatersExpense'])) {
                unset($array_datos['TheatersExpense']);
            }

            //seteo los totales
            $array_datos['Theater']['employee_cost'] = $total_cost_employee;
            $array_datos['Theater']['expense_cost'] = $total_cost_expense;

            //empiezo una transaccion
            $this->Theater->query('SET AUTOCOMMIT = 0;');
            $this->Theater->query('START TRANSACTION;');
            $bandera = true; //la uso para ver si algo salio mal
            //ahora borro todas las relaciones con la tabla theaters_costumes para que despues se carguen solo las correspondientes
            if (!$this->Theater->TheatersCostume->deleteAll(array('TheatersCostume.theater_id' => $array_datos['Theater']['id']), false, false)) {
                $bandera = false;
            }

            //ahora borro todas las relaciones con la tabla theaters_employees para que despues se carguen solo las correspondientes
            if (!$this->Theater->TheatersEmployee->deleteAll(array('TheatersEmployee.theater_id' => $array_datos['Theater']['id']), false, false)) {
                $bandera = false;
            }

            //ahora borro todas las relaciones con la tabla theaters_expenses para que despues se carguen solo las correspondientes
            if (!$this->Theater->TheatersExpense->deleteAll(array('TheatersExpense.theater_id' => $array_datos['Theater']['id']), false, false)) {
                $bandera = false;
            }

            if (!$this->Theater->saveAll($array_datos)) {
                $bandera = false;
            }

            if ($bandera) {
                $this->Session->setFlash(__('La Obra de Teatro ha sido editada', true));
                $this->Theater->query('COMMIT;');
                $this->Theater->query('SET AUTOCOMMIT = 1;');
                $this->redirect(array('controller' => 'futures', 'action' => 'por_dia', strtotime($array_datos['Theater']['start_date'])));
            } else {
                $this->Session->setFlash(__('La Obra de Teatro no ha sido editada. Por favor, intente nuevamente.', true));
                $this->Theater->query('ROLLBACK;');
                $this->Theater->query('SET AUTOCOMMIT = 1;');
            }
        }
        if (empty($this->data)) {
            $this->data = $this->Theater->read(null, $id);

            //aca preparo los campos para que se muestren bien cargados
            $this->data['Theater']['date_from'] = date('d/m/Y', strtotime($this->data['Theater']['start_date']));
            $this->data['Theater']['start_hour'] = date('H', strtotime($this->data['Theater']['start_date']));
            $this->data['Theater']['start_minute'] = date('i', strtotime($this->data['Theater']['start_date']));
            $this->data['Theater']['date_to'] = date('d/m/Y', strtotime($this->data['Theater']['finish_date']));
            $this->data['Theater']['finish_hour'] = date('H', strtotime($this->data['Theater']['finish_date']));
            $this->data['Theater']['finish_minute'] = date('i', strtotime($this->data['Theater']['finish_date']));

            //recorro el array de TheatersCostume y armo un array con los trajes que estan asociados
            $theaters_costumes = array();
            foreach ($this->data['Costume'] as $costume) {
                $theaters_costumes[$costume['id']] = $costume['id'];
                $this->set(compact('theaters_costumes'));
            }

            $this->data['Theater']['employee_count'] = count($this->data['TheatersEmployee']);
            $i = 1;
            $theaters_employees = $this->data['TheatersEmployee'];
            unset($this->data['TheatersEmployee']);
            foreach ($theaters_employees as $emple) {
                $this->data['TheatersEmployee'][$i]['employee_id'] = $emple['employee_id'];
                $this->data['TheatersEmployee'][$i]['cost'] = $emple['cost'];
                $this->data['TheatersEmployee'][$i]['paid'] = $emple['paid'];
                $i++;
            }

            $this->data['Theater']['expense_count'] = count($this->data['TheatersExpense']);
            $i = 1;
            $theaters_expenses = $this->data['TheatersExpense'];
            unset($this->data['TheatersExpense']);
            foreach ($theaters_expenses as $expe) {
                $this->data['TheatersExpense'][$i]['cost'] = $expe['cost'];
                $this->data['TheatersExpense'][$i]['description'] = $expe['description'];
                $i++;
            }
        }

        //armo el array con las horas
        $hours = array();
        for ($i = 8; $i <= 23; $i++) {
            if ($i < 10) {
                $value = '0' . $i;
            } else {
                $value = '' . $i;
            }
            $hours[$i] = $value;
        }
        $this->set(compact('hours'));

        //armo el array con los minutos
        $minutes = array(0 => '00', 30 => '30');
        $this->set(compact('minutes'));

        //traigo un array con todos los trajes
        $costumes = $this->Costume->find('list');
        $this->set(compact('costumes'));

        $empleados = $this->Theater->Employee->find('all', array('fields' => array('Employee.first_name', 'Employee.last_name', 'Employee.id')));
        $employees = array();
        foreach ($empleados as $emp) {
            $employees[$emp['Employee']['id']] = $emp['Employee']['first_name'] . ' ' . $emp['Employee']['last_name'];
        }
        $this->set(compact('employees'));
    }

    function delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Obra de Teatro Inexistente', true));
            $this->redirect(array('action' => 'index'));
        }

        //empiezo una transaccion
        $this->Theater->query('SET AUTOCOMMIT = 0;');
        $this->Theater->query('START TRANSACTION;');
        $bandera = true; //la uso para ver si algo salio mal
        //ahora borro todas las relaciones con la tabla theaters_costumes para que despues se carguen solo las correspondientes
        if (!$this->Theater->TheatersCostume->deleteAll(array('TheatersCostume.theater_id' => $id), false, false)) {
            $bandera = false;
        }

        //ahora borro todas las relaciones con la tabla theaters_employees para que despues se carguen solo las correspondientes
        if (!$this->Theater->TheatersEmployee->deleteAll(array('TheatersEmployee.theater_id' => $id), false, false)) {
            $bandera = false;
        }

        //ahora borro todas las relaciones con la tabla theaters_expenses para que despues se carguen solo las correspondientes
        if (!$this->Theater->TheatersExpense->deleteAll(array('TheatersExpense.theater_id' => $id), false, false)) {
            $bandera = false;
        }

        if (!$this->Theater->delete($id)) {
            $bandera = false;
        }

        if ($bandera) {
            $this->Session->setFlash(__('La Obra de Teatro ha sido eliminada', true));
            $this->Theater->query('COMMIT;');
            $this->Theater->query('SET AUTOCOMMIT = 1;');
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('La Obra de Teatro no ha sido eliminada. Por favor, intente nuevamente.', true));
            $this->Theater->query('ROLLBACK;');
            $this->Theater->query('SET AUTOCOMMIT = 1;');
        }

        $this->redirect(array('action' => 'index'));
    }

    /**
     * Función que se utiliza para pagar a un empleado por los trabajos 
     * realizados en una determinada obra de teatro
     * @param type $theater_id
     * @param type $employee_id
     * @param int $pagar_caja si es 1 indica que se debe pagar con la caja
     */
    function pay($theater_id, $employee_id, $pagar_caja = NULL) {

        //si es un usuario común, solo puede pagar con caja
        if ($this->Auth->user('group_id') == GROUP_USER) {
            $pagar_caja = 1;
        }

        //si tiene que pagar con la caja, registramos este movimiento
        if ($pagar_caja) {

            //busco el monto a registrar
            $res = $this->Theater->TheatersEmployee->find('first', array(
                'fields' => array('SUM(TheatersEmployee.cost) as monto_total'),
                'conditions' => array(
                    'TheatersEmployee.theater_id' => $theater_id,
                    'TheatersEmployee.employee_id' => $employee_id
                )
                    ));

            $monto_pagar = $res[0]['monto_total'];

            //controlo que haya suficiente dinero en la caja
            if (!$this->Cash->controlarPago($monto_pagar)) {
                //si no alcanza el dinero de la caja para pagar 
                //redirecciono al lugar desde donde fue llamado
                $this->Session->setFlash(__('El dinero en la caja no es suficiente para realizar el pago', true));
                $this->redirect($this->referer());
            }

            $array_mov = array();
            $array_mov['user_id'] = $this->Auth->user('id');
            $array_mov['type'] = 'out';
            $array_mov['movement'] = 'employee';
            $array_mov['amount'] = $monto_pagar;
            $array_mov['theater_id'] = $theater_id;
            $array_mov['employee_id'] = $employee_id;

            //guardamos el movimiento
            $this->CashMovement->create();
            $this->CashMovement->save($array_mov);
        }

        if ($this->Theater->TheatersEmployee->updateAll(
                        array('TheatersEmployee.paid' => 1), array(
                    'TheatersEmployee.theater_id' => $theater_id,
                    'TheatersEmployee.employee_id' => $employee_id
                ))
        ) {
            $this->Session->setFlash(__('El Pago ha sido registrado', true));
        } else {
            $this->Session->setFlash(__('El Pago no ha sido registrado. Por favor, intente nuevamente.', true));
        }
        //redirecciono al lugar desde donde fue llamado
        $this->redirect($this->referer());
    }

    /**
     * Función que se utiliza para pagar a un empleado por los trabajos 
     * realizados por las obras de teatro abarcadas en un rango de fechas
     * @param type $employee_id
     * @param type $date_from
     * @param type $date_to
     * @param int $pagar_caja si es 1 indica que se debe pagar con la caja
     */
    function pay_all($employee_id, $date_from, $date_to, $pagar_caja = NULL) {

        //si es un usuario común, solo puede pagar con caja
        if ($this->Auth->user('group_id') == GROUP_USER) {
            $pagar_caja = 1;
        }

        //si tiene que pagar con la caja, registramos este movimiento
        if ($pagar_caja) {
            //voy a controlar si me alcanza el dinero de la caja para pagar
            $sql = 'SELECT SUM(TheatersEmployee.cost) as total
                FROM theaters_employees as TheatersEmployee
                WHERE paid = 0
                AND TheatersEmployee.employee_id = ' . $employee_id . '
                AND TheatersEmployee.theater_id IN (SELECT Theater.id
                                                    FROM theaters as Theater
                                                    WHERE Theater.start_date >= "' . $date_from . '"
                                                     AND Theater.finish_date <= "' . $date_to . '"
                                                              )';

            $res = $this->Theater->query($sql);

            if (empty($res)) {
                //si no encuentra nada es porque hizo alguna cagada con la url
                $this->Session->setFlash(__('Operación inválida', true));
                $this->redirect($this->referer());
            }

            //controlo que haya suficiente dinero en la caja
            if (!$this->Cash->controlarPago($res[0][0]['total'])) {
                //si no alcanza el dinero de la caja para pagar 
                //redirecciono al lugar desde donde fue llamado
                $this->Session->setFlash(__('El dinero en la caja no es suficiente para realizar el pago', true));
                $this->redirect($this->referer());
            }
        }

        if ($this->Theater->payAll($employee_id, $date_from, $date_to, $pagar_caja)) {
            $this->Session->setFlash(__('El Pago de todos las Obras de Teatro ha sido registrado', true));
        } else {
            $this->Session->setFlash(__('El Pago de todos las Obras de Teatro no ha sido registrado. Por favor, intente nuevamente.', true));
        }
        //redirecciono al lugar desde donde fue llamado
        $this->redirect($this->referer());
    }

    function prueba() {
        if (!empty($this->data)) {
            pr($this->data);
            die;
        }
    }

}
